<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
<script>
    // var a = 10
    // function f() {
    //     console.log(a)
    // }
    // function b() {
    //     let a = 10
    //     f()
    // }
    // b()
    //[[Scopes]]用来保存当前函数的执行上下文环境，作用域链，可以理解为一个数组（变量对象连接起来的一个链式结构）（一系列AO对象）
    //作用域链的作用是保证执行环境里有权访问的变量和函数是有序的，作用域链的变量只能向上访问，访问到window对象即被终止，作用域链向下访问是不被允许的
    //作用域链的作用是函数内部可以访问到函数外部的变量，外部则不可以访问到内部的变量
    // console.dir(f)//打印结构
    //闭包
    //a执行和b定义是同一条作用域链
    var global
    function  a(){
        var aa = 13
         function  b(){
            var bb  = 84
            console.log(bb)
            console.log(aa)

        }
        console.log(aa)
    }
    a()//运行结果为13
    // b()的定义和a()的执行的作用域链相同，a()执行完毕之后作用域链断裂，b()无法被定义执行
    //不造成内存的泄露

    function  a(){
        var aa = 13
        return function  b(){
            var bb  = 84
            console.log(bb)
            console.log(aa)
        }
        console.log(aa)
    }
    var res  = a()
    res()//84,13
    //返回出去之后b重新被定义，再次执行
    //造成了内存的泄露

    //闭包不一定造成内存的泄露

    //闭包的实战

    //1.回调函数

    //2.手写bind
    //3.手写一个 LRU 缓存
    //4.定时器传参
    //5.防抖节流


</script>
</body>
</html>